package com.yusvn.scm.common.kit;

import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jfinal.kit.Kv;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Record;

public class MyKit {
	
	/**
	 * json字符串，转换为Kv
	 * @param jsonStr
	 * @return Kv
	 */
	public static Kv jsonStrToKv(String jsonStr) {
		boolean isExcel = false;
		return jsonStrToKv(jsonStr, isExcel);
	}
	
	/**
	 * json字符串，转换为Kv
	 * @param jsonStr
	 * @param isExcel 是否兼容excel表格的复制，即会将字符的空格、制表符、换行、回车替换为英文逗号，从而分割为多个参数
	 * @return Kv
	 */
	@SuppressWarnings("rawtypes")
	public static Kv jsonStrToKv(String jsonStr, boolean isExcel) {
		Kv kv = new Kv(); //必须放第一行
		
		if(StrKit.isBlank(jsonStr)) {
			return kv;
		}
				
		JSONObject jsonObj = null;
		try {
			jsonObj = JSONObject.parseObject(jsonStr);
		}catch (Exception e) {
			System.out.println(e);
			return null;
		}
		
        for (Map.Entry entry : jsonObj.entrySet()) {
        	//System.out.println( entry.getValue() );
        	// 排除值不为空,或空数组空对象
        	if(StrKit.notNull(entry.getValue()) 
        			&& !"[]".equals(entry.getValue().toString()) 
        			&& !"{}".equals(entry.getValue().toString()) ) {
        		kv.set(entry.getKey(), entry.getValue());

        		//如果参数为字符串，先替换中文逗号或空格或制表符(excel复制的多个单元格时空格分割)为英文逗号，再把字符串分割为数组
        		if(entry.getValue() instanceof String) {
        			String str = entry.getValue().toString().replace("，", ",").trim();
        			if(isExcel) {
        				str = str.replaceAll("\\s|\t|\r|\n", ",");  /* \s 空格(\u0008)  \t 水平制表符(\u0009) \r 换行(\u000d)  \n 回车(\u000a) */
        			}
        			//System.out.println(" str:"+str);
        			
            		if(str.indexOf(",")>0) {
            			kv.set(entry.getKey(), str.split(",") );
            		}
        		}
        	}
        }
        //System.out.println(kv.toJson());
        
        return kv;
	}
	
	/**
	 * json字符串，转换为List<Record>
	 * @param jsonStr
	 * @return List<Record>
	 */
	@SuppressWarnings("rawtypes")
	public static List<Record> jsonStrToList(String jsonStr){
		List<Record> recList = new ArrayList<Record>(); //必须放第一行
		
		if(StrKit.isBlank(jsonStr)) {
			return recList;
		}
		
		List<String> jsonArr = null; 
		try {
			jsonArr = JSONArray.parseArray(jsonStr, String.class);
		} catch (Exception e) {
			System.out.println(e);
			return null;
		}
		
		for(String objStr : jsonArr) {
			if(objStr == null || objStr.isEmpty()) {
				continue;
			}
			
			Map ls = JSON.parseObject(objStr, Map.class);
			@SuppressWarnings("unchecked")
			Record rec= new Record().setColumns(ls);
			recList.add(rec);
		}
		
        return recList;
	}
	
	// MD5加密方法 --伯俊调接口需使用
	public static String MD5(String s) {
		String r = "";
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(s.getBytes());
			byte b[] = md.digest();
			int i;
			StringBuffer buf = new StringBuffer("");
			for (int offset = 0; offset < b.length; offset++) {
				i = b[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
			r = buf.toString();
		} catch (Exception e) {
		}
		return r;
	}
	
}
